home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / ai / fuzzy / print_st.b < prev    next >
Text File  |  1986-11-29  |  16KB  |  466 lines

  1. -------------------------------------------------------------------------------
  2. --                                                                           --
  3. --  Separate Unit:  Print_stuff -- Output routines from Prover               --
  4. --                                                                           --
  5. --  Author:  Bradley L. Richards                                             --
  6. --                                                                           --
  7. --     Version     Date     Notes . . .                                      --
  8. --    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -    --
  9. --       2.3    19 Aug 86   Split out from prover                            --
  10. --    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -    --
  11. --                                                                           --
  12. --  Description:  This file contains all output routines for the Prover.     --
  13. --       This includes output from predicates such as WRITE and LISTING as   --
  14. --       well as the debug output from trace and trace commands.             --
  15. --                                                                           --
  16. -------------------------------------------------------------------------------
  17.  
  18. separate(prover)
  19. procedure print_argument( argument : argument_ptr; bindings : binding_list;
  20.               level : natural; quotes : boolean) is
  21.     value : argument_ptr;
  22.     value_level : integer;  -- trash variable
  23.   begin
  24.    if argument = null then
  25.     put("ERROR -- null argument");
  26.    else
  27.     case argument.is_a is
  28.     when character_lit  =>  if quotes then put('''); end if;
  29.                 put(argument.char);
  30.                 if quotes then put('''); end if;
  31.     when predicate      =>  if quotes then put('"'); end if;
  32.                 put(argument.name.name);
  33.                 if quotes then put('"'); end if;
  34.                 if argument.p_arguments /= null then
  35.                   print_arguments(argument.p_arguments,
  36.                           bindings, level, quotes);
  37.                 end if;
  38.     when float_num      =>  put(argument.fp_num);
  39.     when integer_num    =>  put(argument.int_num);
  40.     when prolog_list    =>  print_list(argument.list, bindings, level,
  41.                        quotes);
  42.     when variable       =>  if argument.v_name = null then
  43.                   put('_');
  44.                 else
  45.                   lookup(argument, level, bindings, value, value_level);
  46.                   if value.is_a = variable then
  47.                     put('_' & argument.v_name.name);
  48.                   else
  49.                     print_argument(value, bindings, value_level,
  50.                            quotes);
  51.                   end if;
  52.                 end if;
  53.       end case;
  54.     end if;
  55.   end print_argument;
  56.  
  57.  
  58. separate(prover)
  59. procedure print_arguments( in_arguments : argument_ptr; bindings : binding_list;
  60.                level : natural; quotes : boolean ) is
  61.     arguments : argument_ptr := in_arguments;
  62.   begin
  63.     put( '(' );
  64.     loop
  65.       print_argument( arguments, bindings, level, quotes );
  66.       exit when arguments.next_arg = null;
  67.       arguments := arguments.next_arg;
  68.       put( ", " );
  69.     end loop;
  70.     put( ')' );
  71.   end print_arguments;
  72.  
  73.  
  74. separate(prover)
  75. procedure print_AST( ast_node : AST_ptr; indent : integer ) is
  76.     node : AST_ptr := ast_node;
  77.   begin
  78.     if node = null then
  79.       space(indent); put_line("null node");
  80.     else
  81.       case node.node_type is
  82.         when implication  =>
  83.       while node.node_type = implication loop -- through linked list
  84.         space(indent); put_line("implication node");
  85.         space(indent+2); put_line("head");
  86.         print_AST(node.head, (indent+4));
  87.         space(indent+2); put_line("tail");
  88.         print_AST(node.tail, (indent+4));
  89.         node := node.next;
  90.         exit when node = null;
  91.       end loop;
  92.       if node = null then
  93.         space(indent); put_line("null node");
  94.       else
  95.         space(indent); put_line("error -- link to invalid node");
  96.       end if;
  97.     when binary_operator     =>  space(indent);
  98.                      print_bin_op(node.binary_op);
  99.                      print_AST(node.left_operand,(indent+2));
  100.                      print_AST(node.right_operand,(indent+2));
  101.     when unary_operator      =>  space(indent);
  102.                      print_un_op(node.unary_op);
  103.                      print_AST(node.operand,(indent+2));
  104.     when predicate           =>  print_predicate(node,indent,null,0);
  105.     when integer_num         =>  space(indent);
  106.                      put(node.int_num); new_line;
  107.     when float_num           =>  space(indent);
  108.                      put(node.fp_num); new_line;
  109.     when character_lit       =>  space(indent);
  110.                      put('''); put(node.char); put(''');
  111.     when fuzzy_value         =>  space(indent);
  112.                      put("fuzzy truth value:  ");
  113.                      put(node.fuzzy_num); new_line;
  114.     when reserved_predicate  =>  print_reserved(node,indent,null,0);
  115.     when variable            =>  space(indent);
  116.                      put("variable:  ");
  117.                      if node.var_name = null then
  118.                        put_line("anonymous");
  119.                      else
  120.                        put('"'); put(node.var_name.name);
  121.                        put('"'); new_line;
  122.                      end if;
  123.     when resolution_marker   =>  space(indent);
  124.                      put("resolution level: ");
  125.                      put(node.level);
  126.                      put("     old threshold level: ");
  127.                      put(node.old_threshold); new_line;
  128.                      print_AST(node.subgoals, (indent+2));
  129.     when threshold_marker    =>  space(indent);
  130.                      put("threshold marker: ");
  131.                      put(node.old_threshold);
  132.                      put("     truth value: ");
  133.                      put(node.fuzzy_value); new_line;
  134.       end case;
  135.     end if;
  136.   end print_AST;
  137.  
  138.  
  139. separate(prover)
  140. procedure print_bin_op(operator : binary_operators) is
  141.   begin
  142.     put(operator);
  143.     put_line(" operator");
  144.   end print_bin_op;
  145.  
  146.  
  147. separate(prover)
  148. procedure put_bin_op(operator : binary_operators) is
  149.   begin
  150.     case operator is
  151.       when bar               =>  put(" | ");
  152.       when comma             =>  put(", ");
  153.       when hat               =>  put(" ^ ");
  154.       when semicolon         =>  put("; ");
  155.  
  156.       when asterisk          =>  put(" * ");
  157.       when minus             =>  put(" - ");
  158.       when plus              =>  put(" + ");
  159.       when slash             =>  put(" / ");
  160.       when rw_mod            =>  put(" mod ");
  161.  
  162.       when equal             =>  put(" = ");
  163.       when equality          =>  put(" == ");
  164.       when greater_or_equal  =>  put(" >= ");
  165.       when greater_than      =>  put(" > ");
  166.       when less_or_equal     =>  put(" =< ");
  167.       when less_than         =>  put(" < ");
  168.       when not_equal         =>  put(" \= ");
  169.       when not_equality      =>  put(" \== ");
  170.       when univ              =>  put(" =.. ");
  171.       when rw_is             =>  put(" is ");
  172.     end case;
  173.   end put_bin_op;
  174.  
  175. separate(prover)
  176. procedure print_bindings(bindings_in : binding_list; indent : natural ) is
  177.     bindings : binding_list := bindings_in;
  178.   begin
  179.     while bindings /= null loop
  180.       space(indent);
  181.       put('_' & bindings.name.name & " (");
  182.       put(bindings.level,4); put(")  =  ");
  183.       --
  184.       --  By giving print_argument a binding list of null, we avoid Lookup and
  185.       --  display the actual entries in the binding list
  186.       --
  187.       print_argument(bindings.value, null, 0, quote);
  188.       put(" ("); put(bindings.value_level,4); put(')');
  189.       new_line;
  190.       bindings := bindings.next_binding;
  191.     end loop;
  192.   end print_bindings;
  193.  
  194.  
  195. separate(prover)
  196. procedure print_clause( clause : AST_ptr ) is
  197.   begin
  198.     case clause.node_type is
  199.       when implication  =>
  200.         put('"'); put(clause.head.name.name); put('"');
  201.         if clause.head.p_arguments /= null then
  202.       print_arguments(clause.head.p_arguments, null, 0, quote);
  203.         end if;
  204.         put(" :- ");
  205.         print_clause(clause.tail);
  206.         put_line(" .");
  207.       when binary_operator  =>
  208.         print_clause(clause.left_operand);
  209.         put_bin_op(clause.binary_op);
  210.         print_clause(clause.right_operand);
  211.       when unary_operator  =>
  212.         put_un_op(clause.unary_op);
  213.         print_clause(clause.operand);
  214.       when predicate  =>
  215.     put('"');  put(clause.name.name);  put('"');
  216.     if clause.p_arguments /= null then
  217.       print_arguments(clause.p_arguments, null, 0, quote);
  218.     end if;
  219.       when integer_num  =>  put(clause.int_num);
  220.       when float_num  =>  put(clause.fp_num);
  221.       when character_lit  =>   put(''');  put(clause.char);  put(''');
  222.       when fuzzy_value  =>  put("fuzzy(");  put(clause.fuzzy_num);  put(')');
  223.       when reserved_predicate  =>
  224.     put_reserved(clause.predicate);
  225.     if clause.r_arguments /= null then
  226.       print_arguments(clause.r_arguments, null, 0, quote);
  227.     end if;
  228.       when variable  =>  put(clause.var_name.name);
  229.       when resolution_marker | threshold_marker  =>  raise prover_error;
  230.     end case;
  231.   end print_clause;
  232.  
  233.  
  234. separate(prover)
  235. procedure print_list( in_list : p_list_ptr; bindings : binding_list;
  236.               level : natural; quotes : boolean ) is
  237.     list : p_list_ptr := in_list;
  238.     value : argument_ptr;
  239.     value_level : natural;
  240.   begin
  241.     put( '[' );
  242.     while list /= null loop
  243.       print_argument(list.elt, bindings, level, quotes);
  244.       if list.has_tail and then (list.tail /= null) then
  245.     lookup(list.tail, level, bindings, value, value_level);
  246.     if value.is_a = prolog_list then
  247.       if value.list /= null then
  248.         put(", ");
  249.         print_list_tail(value.list, bindings, value_level, quotes);
  250.       end if;
  251.     else
  252.       put( " | " );
  253.       print_argument(value, bindings, value_level, quotes);
  254.     end if;
  255.     exit;
  256.       elsif list.has_tail and then (list.tail = null) then
  257.     error(no_pointer,"tail of list does not exist");
  258.       else
  259.     list := list.next_elt;
  260.     if list /= null then
  261.       put( ", " );
  262.     end if;
  263.       end if;
  264.     end loop;
  265.     put( ']' );
  266.   end print_list;
  267.  
  268.  
  269. separate(prover)
  270. procedure print_list_tail( in_list : p_list_ptr; bindings : binding_list;
  271.                level : natural; quotes : boolean ) is
  272.     list : p_list_ptr := in_list;
  273.     value : argument_ptr;
  274.     value_level : natural;
  275.   begin
  276.     while list /= null loop
  277.       print_argument(list.elt, bindings, level, quotes);
  278.       if list.has_tail and then (list.tail /= null) then
  279.     lookup(list.tail, level, bindings, value, value_level);
  280.     if value.is_a = prolog_list then
  281.       if value.list /= null then
  282.         put(", ");
  283.         print_list_tail(value.list, bindings, value_level, quotes);
  284.       end if;
  285.     else
  286.       put( " | " );
  287.       print_argument(value, bindings, value_level, quotes);
  288.     end if;
  289.     exit;
  290.       elsif list.has_tail and then (list.tail = null) then
  291.     error(no_pointer,"tail of list does not exist");
  292.       else
  293.     list := list.next_elt;
  294.     if list /= null then
  295.       put( ", " );
  296.     end if;
  297.       end if;
  298.     end loop;
  299.   end print_list_tail;
  300.  
  301. separate(prover)
  302. procedure print_predicate( node : AST_ptr; indent : natural;
  303.                bindings : binding_list; level : natural ) is
  304.   begin
  305.     space(indent);
  306.     put(node.name.name);
  307.     if node.p_arguments /= null then
  308.       print_arguments(node.p_arguments, bindings, level, quote);
  309.     end if;
  310.     new_line;
  311.   end print_predicate;
  312.  
  313. separate(prover)
  314. procedure print_reserved( node : AST_ptr; indent : natural;
  315.               bindings : binding_list; level : natural ) is
  316.   begin
  317.     space(indent);
  318.     put_reserved(node.predicate);
  319.     if node.r_arguments /= null then
  320.       print_arguments(node.r_arguments, bindings, level, quote);
  321.     end if;
  322.     new_line;
  323.   end print_reserved;
  324.  
  325.  
  326. separate(prover)
  327. procedure put_reserved( reserved_predicate : reserved_predicates ) is
  328.   begin
  329.     case reserved_predicate is
  330.       when cut => put('!');
  331.       when rw_asserta => put("asserta");
  332.       when rw_assertz => put("assertz");
  333.       when rw_atom => put("atom");
  334.       when rw_atomic => put("atomic");
  335.       when rw_call => put("call");
  336.       when rw_clause => put("clause");
  337.       when rw_consult => put("consult");
  338.       when rw_debugging => put("debugging");
  339.       when rw_display => put("display");
  340.       when rw_fail => put("fail");
  341.       when rw_float => put("float");
  342.       when rw_functor => put("functor");
  343.       when rw_fuzzy => put("fuzzy");
  344.       when rw_get => put("get");
  345.       when rw_get0 => put("get0");
  346.       when rw_integer => put("integer");
  347.       when rw_listing => put("listing");
  348.       when rw_ln => put("ln");
  349.       when rw_log => put("log");
  350.       when rw_name => put("rw_name");
  351.       when rw_nl => put("nl");
  352.       when rw_nodebug => put("nodebug");
  353.       when rw_nonvar => put("nonvar");
  354.       when rw_notrace => put("notrace");
  355.       when rw_number => put("number");
  356.       when rw_op => put("op");
  357.       when rw_org => put("org");
  358.       when rw_parse => put("parse");
  359.       when rw_put => put("put");
  360.       when rw_read => put("read");
  361.       when rw_repeat => put("repeat");
  362.       when rw_reset => put("reset");
  363.       when rw_retract => put("retract");
  364.       when rw_see => put("see");
  365.       when rw_seeing => put("seeing");
  366.       when rw_seen => put("seen");
  367.       when rw_skip => put("skip");
  368.       when rw_tab => put("tab");
  369.       when rw_tell => put("tell");
  370.       when rw_telling => put("telling");
  371.       when rw_threshold => put("threshold");
  372.       when rw_told => put("told");
  373.       when rw_trace => put("trace");
  374.       when rw_true => put("true");
  375.       when rw_user => put("user");
  376.       when rw_var => put("var");
  377.       when rw_write => put("write");
  378.       end case;
  379.   end put_reserved;
  380.  
  381.  
  382. --
  383. --  Print_result -- display relevant variable bindings to the user along
  384. --                  with the relative truth value of the solution
  385. --
  386. separate(prover)
  387. procedure print_result( bindings_in : binding_list; done : out boolean) is
  388.     answer : string(1..10);
  389.     ans_length : natural;
  390.     bindings : binding_list := bindings_in;
  391.     had_variables : boolean := false;
  392.     template : constant argument_ptr := new argument'(variable, null, null);
  393.     value : argument_ptr;
  394.     value_level : natural;
  395.  
  396.   begin
  397.     while bindings /= null loop
  398.       if bindings.level = 0 then -- it is a user-specified variable
  399.     had_variables := true;
  400.     template.v_name := bindings.name;
  401.     lookup(template, 0, bindings_in, value, value_level);
  402.     put(bindings.name.name); put(" = ");
  403.     case value.is_a is
  404.       when character_lit  =>  put(value.char);
  405.       when predicate      =>  put(value.name.name);
  406.                   if value.p_arguments /= null then
  407.                     print_arguments(value.p_arguments, bindings,
  408.                               value_level, quote);
  409.                   end if;
  410.       when float_num      =>  put(value.fp_num);
  411.       when integer_num    =>  put(value.int_num);
  412.       when prolog_list    =>  print_list(value.list, bindings_in,
  413.                          value_level, quote);
  414.       when variable       =>  put("variable:  _"); put(value.v_name.name);
  415.                   put('/'); put(value_level,4);
  416.       end case;
  417.     new_line;
  418.       end if;
  419.       bindings := bindings.next_binding;
  420.     end loop;
  421.     put("Certainty:  "); put(current_truth); new_line;
  422.     if had_variables then
  423.       put("more?  ");
  424.       get_line(answer, ans_length);
  425.       if ans_length = 0 then -- assume "yes"
  426.         done := false;
  427.       elsif (answer(1) = 'y') or (answer(1) = 'Y') then
  428.         done := false;
  429.       elsif (answer(1) = ';') then -- Prolog version
  430.     done := false;
  431.       else -- assume "no"
  432.         done := true;
  433.       end if;
  434.     else
  435.       done := true;
  436.     end if;
  437.   end print_result;
  438.  
  439.  
  440. separate(prover)
  441. procedure print_un_op(operator : unary_operators) is
  442.   begin
  443.     put(operator);
  444.     put_line(" operator");
  445.   end print_un_op;
  446.  
  447.  
  448. separate(prover)
  449. procedure put_un_op(operator : unary_operators) is
  450.   begin
  451.     case operator is
  452.       when rw_nospy  =>  put(" nospy ");
  453.       when rw_not    =>  put(" not ");
  454.       when rw_spy    =>  put(" spy ");
  455.     end case;
  456.   end put_un_op;
  457.  
  458.  
  459. separate(prover)
  460. procedure space(number : natural) is
  461.   begin
  462.     for i in 1..number loop
  463.     put(' ');
  464.       end loop;
  465.   end space;
  466.